/**
 * 将一个函数柯理化处理
 * @param {*} A 
 * @param {*} B 
 * @param {*} C 
 * @param {*} D 
 * @returns 
 */
function sum(A,B,C,D){
    return A+B+C+D
}

// console.log(sum(1,2,3,4))

// 柯理化方案一：递归
function curry(fn){
    // fn.length 可以拿到函数参数个数？如果是固定个数的参数就可以拿到。
    console.log("fn", fn.length)
    
    return function _cy(...args){
        if(args.length < fn.length){
            return function(){
                const nArgs = args.concat(Array.from(arguments))
                return _cy(...nArgs)
            }
        }
        return fn(...args)
    }
}

// 柯理化方案二：用循环模拟递归

// 测试代码：
const mysum = curry(sum)
console.log(mysum(1,2,3,4))
console.log(mysum(1)(2)(3)(4))
console.log(mysum(1)(2,3)(4))



